package com.skh.array;

import java.util.*;

/**
 * 方阵中战斗力最弱的 K 行
 */
public class KWeakestRows {

    /**
     * 给你一个大小为 m * n 的方阵 mat，方阵由若干军人和平民组成，分别用 0 和 1 表示。
     * <p>
     * 请你返回方阵中战斗力最弱的 k 行的索引，按从最弱到最强排序。
     * <p>
     * 如果第 i 行的军人数量少于第 j 行，或者两行军人数量相同但 i 小于 j，那么我们认为第 i 行的战斗力比第 j 行弱。
     * <p>
     * 军人 总是 排在一行中的靠前位置，也就是说 1 总是出现在 0 之前。
     * <p>
     *  
     * <p>
     * 示例 1：
     * <p>
     * 输入：mat =
     * [[1,1,0,0,0],
     * [1,1,1,1,0],
     * [1,0,0,0,0],
     * [1,1,0,0,0],
     * [1,1,1,1,1]],
     * k = 3
     * 输出：[2,0,3]
     * 解释：
     * 每行中的军人数目：
     * 行 0 -> 2
     * 行 1 -> 4
     * 行 2 -> 1
     * 行 3 -> 2
     * 行 4 -> 5
     * 从最弱到最强对这些行排序后得到 [2,0,3,1,4]
     * 示例 2：
     * <p>
     * 输入：mat =
     * [[1,0,0,0],
     *  [1,1,1,1],
     *  [1,0,0,0],
     *  [1,0,0,0]],
     * k = 2
     * 输出：[0,2]
     * 解释：
     * 每行中的军人数目：
     * 行 0 -> 1
     * 行 1 -> 4
     * 行 2 -> 1
     * 行 3 -> 1
     * 从最弱到最强对这些行排序后得到 [0,2,3,1]
     *  
     * <p>
     * 提示：
     * <p>
     * m == mat.length
     * n == mat[i].length
     * 2 <= n, m <= 100
     * 1 <= k <= m
     * matrix[i][j] 不是 0 就是 1
     */

    public int[] kWeakestRows(int[][] mat, int k) {
        //1.统计每行军人的数量,保存到map中
        //2.将军人的数量进行排序
        //3.取前k名的行数
        //4.将行数放到数组中
        Map<Integer, Integer> map = new LinkedHashMap<>();
        for (int i = 0; i < mat.length; i++) {
            int count = 0;
            for (int j = 0; j < mat[0].length; j++) {
                if (mat[i][j] == 1) {
                    count++;
                } else {
                    break;
                }
            }
            map.put(i, count);
        }

        List<Integer> index = new ArrayList<>();
        for (int i = 0; i < mat.length; i++) {
            index.add(i);
        }

        //排序
        Collections.sort(index,new Comparator<Integer>(){

            @Override
            public int compare(Integer o1, Integer o2) {
                return map.get(o1)-map.get(o2);
            }
        });

        int[] result = new int[k];
        for (int i = 0; i < k; i++) {
            result[i] = index.get(i);
        }
        return result;
    }
}
